(function( window, undefined ) {

// Model Class
var Model = Class({
	name: "Model", 
	parent: "Core", 
	constructor: function() {

		var _attributes;
		var _newRecord = true;
		var _key = undefined;
	
		return {
			__construct: function( attr ) {
				_key = this.guid();
				_attributes = attr || {};
			},
			
			guid: function() { // 고유키 생성
				return 'Modelxxxx-xxxx-xxxx-xxxx'.replace(/[xy]/g, function(c) {
					var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
					return v.toString(16);
				}).toUpperCase();
			},
			
			destroy: function() { // 파괴자 함수
				console.log( "destroy" );
			
				_attributes = undefined; // 데이타 제거
			},
			
			key:function() { // 고유키 값
				return _key;
			},
			
			attributes: function() { // 데이타
				return _attributes;
			},
			
			getAttribute: function( name ) { // 데이타 값 리턴
				if ( !_attributes) return undefined;
				
				return _attributes[name];
			},
			
			setAttribute: function( name, value ) { // 데이타 값 설정
				if ( !_attributes) return undefined;
				
				return _attributes[name] = value;
			},
			
			create: function() { // Record Set 에 저장
				_newRecord = false;
				
				Model.Records[_key] = this.duplicate();
			},
			
			update: function() { // Record Set 에 값 Update ( 필요 없다고 보임 )
				Model.Records[_key] = this.duplicate();
			},
			
			duplicate : function() { // 역시 필요 없음. 값이 자동으로 바뀌기 때문에 복사해주는 함수
				return this;//jQuery.extend( true, {}, this );
			},
			
			save: function() { // 저장하기
				_newRecord ? this.create() : this.update();
			},
			
			// 
			toJSON: function() { // Object Return - 책 예재임 ...
				return ( this.attributes() );
			}
		};
	}
});

// Model Storage
// Iterator Pattern 으로 구현 필요
Model.Records = {};	// Record Set 값
Model.prototype.find = Model.find = function(key) { // RecordSet 에서 Model 가져오는 함수
	var record = Model.Records[key];
	if ( !record ) throw( "Unknown Record" );
	return record.duplicate();
};

Class.Model = Model;

// Controller Class
var Controller = Class({
	name: "Controller", 
	parent: "Core", 
	constructor: function() {
	
		return {
			proxy:Class.proxy,
		
			loadView: function( func ) { // view 가 로딩 완료 되었을때 실행하려고 만든 함수
				$(this.proxy(func, this));
			}
		};
	}
});

Class.Controller = Controller;

// View Class
var View = Class({

	name: "View", 
	parent: "Core", 
	constructor: function() {
	
		var $_view;
		var $_template;
		
		return {
			__construct: function( $view ) { // $view 설정
				$_view = $view;
			},
			
			view: function() {
				return $_view;
			},
		
			load: function( $templete ) {
				$_template = $templete;
			},
			
			template: function( data, clear ) { // view 에 템플릭을 
				if ( clear == true ) {
					this.view.html("");
				};
			
				$element = $_template.tmpl( data );
				
				//this.view.append( $element );
			}
		};
	}
});

Class.View = View;

})(window);
